#include<graphics.h>
#include<conio.h>
#include<stdlib.h>
#pragma comment(lib,"Winmm.lib")

//函数外全局变量定义
#define High 700
#define Width 500
IMAGE img_bk;  //背景图片
IMAGE img_planeNormal1,img_planeNormal2;  //正常飞机图片
int position_x,position_y;  //飞机坐标
IMAGE img_bullet1,img_bullet2;  //子弹图片
int bullet_x,bullet_y;
IMAGE img_enemyPlane1,img_enemyPlane2;  //敌机图片
float enemy_x,enemy_y;  //敌机位置
IMAGE img_planeExplode_1,img_planeExplode_2;

void startup()  //数据初始化
{
	mciSendString("open D:\\飞机大战图片音乐素材\\game_music.mp3 alias bkmusic",NULL,0,NULL);  //背景音乐
	mciSendString("play bkmusic repeat",NULL,0,NULL);  //循环播放

	initgraph(Width,High);
	loadimage(&img_bk,"D:\\飞机大战图片音乐素材\\background.jpg");
	loadimage(&img_planeNormal1,"D:\\飞机大战图片音乐素材\\planeNormal_1.jpg");
	loadimage(&img_planeNormal2,"D:\\飞机大战图片音乐素材\\planeNormal_2.jpg");
	loadimage(&img_bullet1,"D:\\飞机大战图片音乐素材\\bullet1.jpg");
	loadimage(&img_bullet2,"D:\\飞机大战图片音乐素材\\bullet2.jpg");
	loadimage(&img_enemyPlane1,"D:\\飞机大战图片音乐素材\\enemyPlane1.jpg");
	loadimage(&img_enemyPlane2,"D:\\飞机大战图片音乐素材\\enemyPlane2.jpg");
	loadimage(&img_planeExplode_1,"D:\\飞机大战图片音乐素材\\planeExplode_1.jpg");
	loadimage(&img_planeExplode_2,"D:\\飞机大战图片音乐素材\\planeExplode_2.jpg");

	position_x=Width*0.5;
	position_y=High*0.7;
	bullet_x=position_x;
	bullet_y=-100;
	enemy_x=Width*0.5;
	enemy_y=0;	
	BeginBatchDraw();

}

void show()  //显示画面
{
	putimage(0,0,&img_bk);  //显示背景
	putimage(position_x-50,position_y-60,&img_planeNormal1,NOTSRCERASE);  //显示正常飞机
	putimage(position_x-50,position_y-60,&img_planeNormal2,SRCINVERT);
	putimage(bullet_x,bullet_y,&img_bullet1,NOTSRCERASE);  //显示子弹
	putimage(bullet_x,bullet_y,&img_bullet2,SRCINVERT);
	putimage(enemy_x,enemy_y,&img_enemyPlane1,NOTSRCERASE);  //显示敌机
	putimage(enemy_x,enemy_y,&img_enemyPlane2,SRCINVERT);
	
	FlushBatchDraw();
	Sleep(5);
}
void updateWithoutInput()  //与用户输入无关的更新
{
	if(bullet_y>-50)
	bullet_y=bullet_y-2;  //子弹向上移动
	if(enemy_y<High)
		enemy_y=enemy_y+0.5;
	else
	{
		enemy_x=rand()%Width;
		enemy_y=0;
	}
	if (abs(enemy_y-bullet_x)+abs(enemy_y-bullet_y)<100)  //子弹击中敌机
	{
		mciSendString("close f_gun",NULL,0,NULL);  //先把前一次的音乐关掉
		mciSendString("open D:\\飞机大战图片音乐素材\\f_gun.mp3 alias f_gun",NULL,0,NULL);  //打开音乐
		mciSendString("play f_gun",NULL,0,NULL);  //仅播放一次
		enemy_x=rand()%Width;
		enemy_y=0;			
	}
	if (abs(enemy_y-position_x)+abs(enemy_y-position_y)<100)  //敌机击中我机
	{
		mciSendString("close explode",NULL,0,NULL);  //先把前一次的音乐关掉
		mciSendString("open D:\\飞机大战图片音乐素材\\explode.mp3 alias explode",NULL,0,NULL);  //打开音乐
		mciSendString("play explode",NULL,0,NULL);  //仅播放一次
		putimage(enemy_x,enemy_y+100,&img_planeExplode_1,NOTSRCERASE);
		putimage(enemy_x,enemy_y+100,&img_planeExplode_2,SRCINVERT);		
		Sleep(3000);
		exit(0);
	}
}
void updateWithInput()  //与用户输入有关的更新
{
	MOUSEMSG m;  //记录鼠标消息
	while (MouseHit())
	{
		m=GetMouseMsg();
		if (m.uMsg==WM_MOUSEMOVE)  //鼠标移动时，飞机坐标等于鼠标位置
		{
			position_x=m.x;
			position_y=m.y;
		}
		else if (m.uMsg==WM_LBUTTONDOWN)  //按下鼠标左键时，发射子弹
		{
			bullet_x=position_x-7;
			bullet_y=position_y-80;
		}
	}	
}

void gameover()
{
	EndBatchDraw();
	getch();
	closegraph();
}

int main()
{	
	startup(); //数据初始化
	
	while(1)  //游戏循环执行
	{
		show();  //显示画面
		updateWithoutInput();  //与用户输入无关的更新
		updateWithInput();  //与用户输入有关的更新
	}
	gameover();
	return 0;
}